<?php
/**
 * 皇玛支付接口
 */
namespace Mobile\Controller;
use Think\Controller;

//162666000001141 上势国际陈送军 3z35dhn6kyoak52k 

class PayhmController extends Controller
{

//    public $merchant_no = '162666000001063'; // 商户号
//    public $mch_name = '冠导生物科技（杭州）有限公司'; // 商户名
//    public $mch_key = 'twuzzh031ra5kfym'; // 商户支付密钥Key。
//    public $merchant_no = '162666000001073'; // 商户号
//    public $mch_name = '哇哦科技（上海）有限公司'; // 商户名
//    public $mch_key = '2bs1kzagosiffs6s'; // 商户支付密钥Key。
//    public $api_url = 'http://139.224.61.115:3030/hmpay/online/'; // 接口请求地址
    
    //测试环境
//    public $merchant_no = '162666000001000'; // 商户号
//    public $mch_name = '哇哦科技（上海）有限公司'; // 商户名
//    public $mch_key = '5x77q6oakyxbev7i'; // 商户支付密钥Key。
//    public $api_url = 'http://139.224.61.115:6666/hmpay/online/'; // 接口请求地址
    
    //网关支付接口
//    public $wg_merchant_no = '162666000001015'; // 商户号
//    public $wg_mch_name = '娇霏生物科技（上海）有限公司'; // 商户名
//    public $wg_mch_key = 'rxkrzfhmxrofad6c'; // 商户支付密钥Key。
//    public $wg_api_url = 'http://139.224.61.115:6666/hmpay/online/'; // 接口请求地址
    public function __construct($arr='')
    {
        parent::__construct();
    }
    
    
    /*
     * 创建订单参数
     */
    protected function _createOrder($order,$api_url,$notifyurl,$pay_type='',$bank=''){
        
        $pay_data = array(
            "merchant_no" => $this->merchant_no,
            "total_fee" => $order['pay_money']*100,//金额,分
            "pay_num" => $order['order_sn'],//商户内部订单号 ,注意:同一个商城内部订单号多次请求 他那边返回的外部订单号不一样,
                                            //而且这个支付系统外部订单号和微信系统的外部订单号也不相同
                                            //这个接口设计的很奇怪,注意区分: 商城外部订单号 ≠ 支付系统外部订单号 ≠ 微信支付外部订单号 ≠ 银行订单号   ≠ 微信支付流水号
            "notifyurl" => $notifyurl,//异步通知
            "productname" => $order['order_title'],//标题,没什么鸟用
        );
        if($pay_type){
            $pay_data['bankCode'] = $bank['ecom_bianhao'];
            $pay_data['bankFlag'] = $bank['bankflag'];
            $pay_data['merchant_no'] = $this->wg_merchant_no;
            $sign_str = $this->wg_merchant_no.$pay_data['total_fee'].date("Ymd").$this->wg_mch_key;
        }else{
            $sign_str = $this->merchant_no.$pay_data['total_fee'].date("Ymd").$this->mch_key;
        }
        
        
        $pay_data["sign"] = strtoupper(md5($sign_str));//签名 sign =MD5(merchant_no+total_fee+today+key)；
        $result = $this->_curlPost($api_url,$pay_data);
       /*  dump($api_url);
        dump($pay_data); */
        $res = json_decode($result,true);
        
        return $res;
    }
    
    
    /*
     * 查询订单/撤销订单
     */
    protected function _checkOrder($out_trade_no,$api_url){
    
        $pay_data = array(
            "merchant_no" => $this->merchant_no,
            "out_trade_no" => $out_trade_no,// 他那边返回的外部订单号
        );
    
        $sign_str = $this->merchant_no.$pay_data['out_trade_no'].date("Ymd").$this->mch_key;
        $pay_data["sign"] = strtoupper(md5($sign_str));//签名 sign =MD5(merchant_no+out_trade_no+today+key)；
        $result = $this->_curlPost($api_url,$pay_data);
        $res = json_decode($result,true);
    
        return $res;
    }


    
    /*
     * 微信生成订单接口
     * 测试通过
     * 注意: 他会创建一个 外部订单号 out_trade_no, 这个订单号要保存到数据库
     */
    public function wechatCreateOrder($order='',$notifyurl='')
    {
        $order = array(
            "pay_money" => $order['pay_money'],
            "order_sn" => $order['order_sn'],//商户内部订单号 ,注意:同一个商城内部订单号多次请求 他那边返回的外部订单号不一样
            "order_title" => $order['order_title'],//没什么鸟用
        );
        
        $api_url = $this->api_url."createYyWxOrderD0.do";
        
        //$notifyurl = get_domain()."/mobile/payhm/wechatcallback";
        $res = $this->_createOrder($order,$api_url,$notifyurl);
        //_pr($res);

        if($res['return_code'] == 10000){
            $out_trade_no = $res['out_trade_no'];
            $code_url = $res['code_url'];
            $data = array(
                "out_trade_no" => $out_trade_no,//返回的外部订单号
                "code_url" => $code_url,//二维码内容
            );
            //return_json(0,$res['message'],$data);//生成订单失败
            return $data;
        }else{
            dump($res);
        }
        
        return false;
       // return_json(1,$res['message']);//生成订单失败
    }
    
    
    /*
     * 查询微信订单
     * 测试通过
     */
    public function wechatCheckOrder($out_trade_no=''){
        
        //$out_trade_no = "D0100119011003505186";
        
        $api_url = $this->api_url."searchYyWxOrderD0.do";
        
        $res = $this->_checkOrder($out_trade_no,$api_url);
        
        if($res['return_code'] == 10000){
            
            return true;
           // return_json(0,$res['message']);//支付成功
        }
        return false;
        //return_json(1,$res['message']);//支付失败
        
    }
    
    
    /*
     * 支付宝生成订单接口
     * 测试不通过
     */
    
    public function alipayCreateOrder($order)
    {
        $order = array(
            "pay_money" => $order['pay_money'],
            "order_sn" => $order['order_sn'],
            "order_title" => $order['order_title'],
        );
    
        $api_url = $this->api_url."createAliOrder.do";
    
        $notifyurl = "http://pay.wao021.cn";
    
        $res = $this->_createOrder($order,$api_url,$notifyurl);
        //_pr($res);
        if($res['return_code'] == 10000){
            $out_trade_no = $res['out_trade_no'];
            $code_url = $res['code_url'];
            
            $data = array(
                "out_trade_no" => $out_trade_no,//返回的外部订单号
                "code_url" => $code_url,//二维码内容
            );
            return $data;
        }
        
        return false;
    }
    
    
    /*
     * 查询支付宝订单
     * 测试不通过
     */
    public function alipayCheckOrder($out_trade_no=''){
    
        $out_trade_no = "D0100119011003505186";
    
        $api_url = $this->api_url."searchOrder.do";
    
        $res = $this->_checkOrder($out_trade_no,$api_url);
    
        if($res['return_code'] == 10000){
            return true;
        }
        return false;
    
    }
    
    /*
     * 支付宝撤销订单
     */
    public function alipayRefund($order){
        
        //检查参数
        if(!is_array($order)){
            return false;
        }
        
        $out_trade_no = $order['out_trade_no'];
        
        $api_url = $this->api_url."refundOrder.do";
        
        $res = $this->_checkOrder($out_trade_no,$api_url);
        
        if($res['return_code'] == 10000){
            return true;
        }
        return false;
        
        
    }
    

    /*
     * 无卡提交订单
     */
    public function noCardCreateOrder($order,$cardinfo){
    
       /*  $order = array(
            "order_sn" => 'test123',
            'pay_money' => '10'
        );
    
        $cardinfo = array(
            'cardno' => '6226388000000095',
            'validthru' => '1219',
            'cvv2' => '248',
            'phone' => '18100000000',
            "name" => "张三",
            "idcard" => '510265790128303',
        ); */
        
        //10元以下的订单不支持无卡支付
        if($order['pay_money']<10){
            return_json(1,"金额小于10元的订单暂不支持银行卡支付");
        }
        
    
        $pay_data = array(
            "merchant_no" => $this->merchant_no,
            "cardno" => $cardinfo['cardno'],//卡号
            'cardtype' => $cardinfo['cardtype'],
            "amount" => $order['pay_money']*100,//分
            "validthru" => $cardinfo['validthru'],//卡有效期 MMYY
            "cvv2" => $cardinfo['cvv2'],//鉴权码
            "phone" => $cardinfo['phone'],//持卡人手机号
            "name" => $cardinfo['name'],//鉴权码
            "idcard" => $cardinfo['idcard'],//持卡人手机号
        );
        
    
       // pr($pay_data);
         
        $api_url = $this->api_url."createNcOrder.do";
    
        $sign_str = $this->merchant_no.$pay_data['amount'].date("Ymd").$this->mch_key;
        $pay_data["sign"] = strtoupper(md5($sign_str));//签名sign =MD5(merchant_no+out_trade_no+today+key)；
        
    
        $result = $this->_curlPost($api_url,$pay_data);
        $res = json_decode($result,true);
        //_pr($res);
    
        if($res['return_code'] == 10000){
            $data = array(
                "out_trade_no" => $res['orderid'],//返回的银行订单号
            );
            return $data;
        }else{

            $msg = "创建支付信息失败:错误码:".$res['return_code']." 错误信息:".$res['returnmsg'].$res['return_msg'];
            return_json(1,$msg);
            
        }
    
        return false;
    
    }
    
    
    /*
     * 无卡订单支付
     */
    public function noCardPay($pay_data){
         
    
        /* $pay_data = array(
            "orderid" => 'yync2016082310470372246',//银行订单号
            "validatecode" => '261842',//短信验证码
        ); */
        $pay_data = array(
            "merchant_no" => $this->merchant_no,
            "orderid" => $pay_data['orderid'],//银行订单号
            "validatecode" => $pay_data['validatecode'],//短信验证码
        );
    
        $orderid = $pay_data['orderid'];
    
        $api_url = $this->api_url."nocardPay.do";
    
        $sign_str = $this->merchant_no.$orderid.date("Ymd").$this->mch_key;
        $pay_data["sign"] = strtoupper(md5($sign_str));//签名sign =MD5(merchant_no+ orderid +today+key)；
    
        $result = $this->_curlPost($api_url,$pay_data);
        $res = json_decode($result,true);
        
    
        if($res['return_code'] == 10000){
            $data = array(
                "out_trade_no" => $res['orderid'],//返回的银行订单号
            );
            return $data;
        }else{
            
            $msg = "创建支付信息失败:错误码:".$res['return_code']." 错误信息:".$res['returnmsg'].$res['return_msg'];
            return_json(1,$msg);
            
        }
    
        return false;
    
    }
    
    
    /*
     *
     * 无卡支付查询订单
     */
    public function noCardPayCheckOrder($out_trade_no=''){
    
        $out_trade_no = "yync2016082310470372246";
    
        $api_url = $this->api_url."searchNcOrder.do";
    
        $pay_data = array(
            "merchant_no" => $this->merchant_no,
            "orderid" => $out_trade_no,// 他那边返回的外部订单号
        );
    
        $sign_str = $this->merchant_no.$pay_data['orderid'].date("Ymd").$this->mch_key;
        $pay_data["sign"] = strtoupper(md5($sign_str));//签名 sign =MD5(merchant_no+orderid+today+key)；
        $result = $this->_curlPost($api_url,$pay_data);
        $res = json_decode($result,true);
    
        if($res['return_code'] == 10000){
            return true;
        }else{
            $msg = "创建支付信息失败:错误码:".$res['return_code']." 错误信息:".$res['returnmsg'].$res['return_msg'];
            return_json(1,$msg);
        }
        return false;
    
    }
    /*
     * 回调测试
     */
    public function wechatcallback(){
        file_put_contents("hm1.txt",$_POST);
        file_put_contents("hm2.txt",$_GET);
        
        echo 111;
    }
    
    
    public function _curlPost($url,$data){
//        dump($url);
//        dump($data);
        
        $ch = curl_init();
        $header = "Accept-Charset: utf-8";
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "get");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $tmpInfo = curl_exec($ch);
        if($data['bankCode']){
            header("Content-type: text/html; charset=utf-8"); 
            echo 'waiting...';
            echo $tmpInfo;exit;
        }
        curl_close($ch);
        return $tmpInfo;
        
    }
    
    public function getCallbackSign($arr,$wg=''){
        if($wg){
            $sign_str = $this->wg_merchant_no.$arr['out_trade_no'].$arr['pay_num'].$arr['total_fee'].$this->wg_mch_key;
        }else{
            $sign_str = $this->merchant_no.$arr['out_trade_no'].$arr['pay_num'].$arr['total_fee'].$this->mch_key;
        }
        
        $sign = strtoupper(md5($sign_str));
        return $sign;
    }

    
     /*
     * 2017年3月7日16:43:27, 
     * TODO
     * 网关支付
     */
    public function wgPay($order='',$bank){
        
        $api_url = $this->wg_api_url."createWsymWgOrder.do";
        $notifyurl = get_domain().'/mobile/orderhm/wangyincallback';
        $res = $this->_createOrder($order,$api_url,$notifyurl,"gwpay",$bank);//生成网管支付订单,无返回值,直接跳转

    }
    
    /*
     * 查询网关订单
     * 测试通过
     */
    public function wgCheckOrder($out_trade_no=''){
    
    
        $api_url = $this->api_url."searchWsymWgOrder.do";
    
        $res = $this->_checkOrder($out_trade_no,$api_url,'gwpay');
    
        if($res['return_code'] == 10000){
    
            return true;
            // return_json(0,$res['message']);//支付成功
        }
        return false;
        //return_json(1,$res['message']);//支付失败
    
    }
    
}
